#include <iostream>
using namespace std;

int a[1005];  
/*
author:杨老师
title: 和为给定数（小数据）
title_description:  给出若干个整数，询问其中是否有一对数的和等于给定的数。
input_description:  输入共三行：
					第一行是整数n(0 < n <= 1000)，表示有n个整数。
					第二行是n个整数。整数的范围是在0到10^8之间。
					第三行是一个整数m（0 <= m <= 2^30)，表示需要得到的和。

output_description:  若存在和为m的数对，输出两个整数，小的在前，大的在后，中间用单个空格隔开。
					 若有多个数对满足条件，选择数对中较小的数更小的。若找不到符合要求的数对，输出一行No。
*/ 
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }
    int m;
    // 输入和 
    cin >> m;

	// 排序 
    for (int i = 1; i < n; i++) {  
        for (int j = 1+i; j <= n ; j++) {  
            if (a[i] > a[j]) {
            	int temp = a[j];
            	a[j] = a[i];
            	a[i] = temp;

            }
        }
    }
 	// 查找 
    for (int i = 1; i <= n; i++) {  
        // 计算当前元素对应的另一个数，使得两数之和为m
		int target = m - a[i];  
        // 在已排序的数组中，除去当前元素的剩余部分查找目标值（使用二分查找）
        int left = i+1;
        int right = n;
        while (left <= right) {
	        // 计算中间元素的索引，采用这种方式防止整数溢出
	        int mid = left + (right - left) / 2;
	        // 如果中间元素等于目标值，说明找到了目标值，返回true
	        if (a[mid] == target) {
	           cout << a[i] << " " << target << endl; 
	           return 0; 
	        }
	        // 如果中间元素小于目标值，说明目标值可能在右半区间，更新查找区间为右半部分
	        if (a[mid] < target) {
	            left = mid + 1;
	        }
	        // 如果中间元素大于目标值，说明目标值可能在左半区间，更新查找区间为左半部分
	        else {
	            right = mid - 1;
	        }
	    }
    }
    cout << "No" << endl;
    return 0;
}